`
https://leetcode.cn/problems/fraction-to-recurring-decimal/
`

/**
 * @param {number} numerator
 * @param {number} denominator
 * @return {string}
 */
var fractionToDecimal = function (numerator, denominator) {
  if (numerator === 0) return "0"
  // 判断结果是否为负数
  const isNegative = (numerator < 0) ^ (denominator < 0);
  // 将分子和分母都转为正数，方便计算
  [numerator, denominator] = [Math.abs(numerator), Math.abs(denominator)];
  // 余数对应的下标
  const appear = new Map()
  // 计算整数部分
  const integer = Math.trunc(numerator / denominator)
  // 计算余数
  let remainder = numerator % denominator
  // 当前余数下标位置
  let i = 0
  // 存储小数部分
  let fractional = []
  // 长除法处理小数部分
  while (remainder) {
    // 如果余数曾出现过，则说明出现了循环
    if (appear.has(remainder)) {
      // 计算循环部分的长度
      const circleLen = i - appear.get(remainder)
      // 获取循环部分
      const circle = fractional.slice(fractional.length - circleLen)
      // 从小数部分里剔除循环部分
      fractional = fractional.slice(0, fractional.length - circleLen)
      // 拼接结果
      return `${isNegative ? '-' : ''}${integer}${fractional.length || circle.length ? '.' : ''}${fractional.join('')}(${circle.join('')})`
    }
    appear.set(remainder, i++)
    remainder *= 10
    const res = Math.trunc(remainder / denominator)
    remainder %= denominator
    fractional.push(res)
  }
  // 可以直接整除
  return `${isNegative ? '-' : ''}${integer}${fractional.length === 0 ? '' : '.'}${fractional.join('')}`
};